/*
    单例内置对象
        任何由ES实现提供，与宿主环境无关，并在ES程序开始的时候就存在的对象。Object、Array、String
        本次介绍两个内置对象Global、Math
        5.4.1 Global
            代码不会显式的访问，nodejs的全局对象是Global对象。在全局作用域中定义的变量和函数都会变成Global对象的属性。
            isNaN()、isFinite()、parseInt()和 parseFloat()，实际上都是 Global 对象的方法。
            1.URL编码方法
                encodeURI()方法和encodeURIComponent()是编码方法，encodeURI()无法编译特殊字符，另一个可以
                decodeURI()和decodeURIComponent()是解码方法。
            2.eval()，整个ES中最强大的方法，这个方法是一个完整的ES解释器，它接收一个参数，就是要执行的ES(JS)字符串。
                当解释器发现 eval()调用时，会将参数解释为实际的 ECMAScript 语句，然后将其插入到该位置。
            3.Global对象属性
                undefined、NaN和Infinity等特殊值都是Global对象属性。此外，所有原生引用类型构造函数，比如 Object 和 Function，也都是
                Global 对象的属性。
            4.window对象，在浏览器环境将window对象实现为Global对象的代理，因此全局作用域的变量和函数都变成了window的属性
        5.4.2 Math
            1.Math对象属性
                Math.E 自然对数的基数 e 的值 
                Math.LN10 10 为底的自然对数 
                Math.LN2 2 为底的自然对数 
                Math.LOG2E 以 2 为底 e 的对数 
                Math.LOG10E 以 10 为底 e 的对数 
                Math.PI π 的值 
                Math.SQRT1_2 1/2 的平方根 
                Math.SQRT2 2 的平方根 
            2.min()和max()方法，用于确定一组数值的中的最大值和最小值，都接收任意多个参数
                可使用let values = [1, 2, 3, 4, 5, 6, 7, 8]; 
                        let max = Math.max(...val); 判断数组中的最大值
            3.舍入方法 4个方法
                Math.ceil()、Math.floor()、Math.round()、Math.fround()
                1.Math.ceil()始终向上舍入最接近的整数
                2.Math.floor()始终向下舍入最近的整数
                3.Math.round()方法执行四舍五入
                4.Math.fround()返回数值最接近的单精度（32位）浮点值表示。
            4.random()方法  始终返回小数 
                Math.random()方法返回一个0-1范围内的随机数，包含0，不包含1。
            返回指定范围的数字公式
                Math.floor(Math.random()*(结束值-开始值+1)，开始值)
                比如1-10
                Math.floor(Math.random()*(10-1+1),1)
            5.其他方法
                Math.abs(x) 返回 x 的绝对值 
                Math.exp(x) 返回 Math.E 的 x 次幂 
                Math.expm1(x) 等于 Math.exp(x) - 1 
                Math.log(x) 返回 x 的自然对数 
                Math.log1p(x) 等于 1 + Math.log(x) 
                Math.pow(x, power) 返回 x 的 power 次幂 
                Math.hypot(...nums) 返回 nums 中每个数平方和的平方根 
                Math.clz32(x) 返回 32 位整数 x 的前置零的数量 
                Math.sign(x) 返回表示 x 符号的 1、0、-0 或-1 
                Math.trunc(x) 返回 x 的整数部分，删除所有小数 
                Math.sqrt(x) 返回 x 的平方根 
                Math.cbrt(x) 返回 x 的立方根 
                Math.acos(x) 返回 x 的反余弦 
                Math.acosh(x) 返回 x 的反双曲余弦 
                Math.asin(x) 返回 x 的反正弦 
                Math.asinh(x) 返回 x 的反双曲正弦 
                Math.atan(x) 返回 x 的反正切 
                Math.atanh(x) 返回 x 的反双曲正切 
                Math.atan2(y, x) 返回 y/x 的反正切 
                Math.cos(x) 返回 x 的余弦 
                Math.sin(x) 返回 x 的正弦 
                Math.tan(x) 返回 x 的正切
*/
eval(console.log("hi"))
let num = 12.22312
console.log(Math.ceil(num))
console.log(Math.floor(Math.random()))
// 公式1-10 选择范围内的随机数公式
// total_number_of_choices = 10-1+1; 
// first_possible_value = 开始的那个值 如果是1-10 那么就是1开始
// number = Math.floor(Math.random()*total_number_of_choices+first_possible_value)
function selectFrom(lowerValue, upperValue) { 
    let choices = upperValue - lowerValue + 1;
    return Math.floor(Math.random() * choices + lowerValue);
}
let num2 = selectFrom(2, 10)
console.log(num2, 'num2')
/*
    应用
    根据以下颜色随机选择
*/
const colors = ["red", "green", "blue", "yellow", "black", "purple", "brown"];
const color = colors[0,colors.length-1]